/**
 * 作者: 会写BUG
 * 创作日期: 2025/3/21 13:57
 * 描述: cwbQtPractice.ChessPanel
 *
 **/
#pragma once

#include <QParallelAnimationGroup>
#include <QWidget>

#include "number_chess.h"

class ChessPanel
    : public QWidget
{
    Q_OBJECT

public:
    explicit ChessPanel(QWidget* _parent = nullptr);
    ~ChessPanel() override;

    QSize sizeHint() const override;
    QSize minimumSizeHint() const override;

    /* 加载数字棋盘 */
    void loadChess();

protected:
    void paintEvent(QPaintEvent* event) override;
    bool eventFilter(QObject* watched, QEvent* event) override;

private:
    void initChessRect();
    /* 根据索引号计算棋盘做格坐标 x = col y = row */
    QPoint convertMatrixPos(int _index);
    /* 根据行和列计算索引位置 */
    int convertIndex(int _row, int _col);
    /* 向上移动全部数字块 */
    void moveUp();
    /* 向下移动全部数字块 */
    void moveDown();
    /* 向左移动全部数字块 */
    void moveLeft();
    /* 向右移动全部数字块 */
    void moveRight();
    /* 清理无效的数字块 */
    void updateChess();
    /* 在指定位置生成数据 */
    NumberChess* generateChess(int _row, int _col, int _num = 0);

private Q_SLOTS:
    /* 动画结束 */
    void moveAnimationEnd();

private:
    /* 数字快尺寸 */
    QSize chess_size_ = {60, 60};
    /* 行列间隔 */
    int grid_space_ = 12;
    /* 数字快格子 */
    QList<QRect> chess_rects_ = {};
    /* 棋子对象 */
    QMap<int, NumberChess*> number_cheeses_ = {};
    /* 移动并行动画 */
    QParallelAnimationGroup* move_animation_group_ = nullptr;
    /* 出现数字块动画 */
    QPropertyAnimation* generate_animation_ = nullptr;

};
